From 789a26a608325a07aa5bdd3955a3d342eb29e03b Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Fri, 22 Jun 2007 11:44:44 -0600 Subject: [PATCH] [IA64] Enable PV domain debugging. Signed-off-by: Tristan Gingold --- xen/arch/ia64/xen/faults.c | 17 ++++++---- xen/include/asm-ia64/debugger.h | 35 ++++++--------------- xen/include/asm-ia64/linux-xen/asm/ptrace.h | 1 + 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/xen/arch/ia64/xen/faults.c b/xen/arch/ia64/xen/faults.c index 7528d2e0ca..63be84df2f 100644 --- a/xen/arch/ia64/xen/faults.c +++ b/xen/arch/ia64/xen/faults.c @@ -647,6 +647,11 @@ ia64_handle_reflection(unsigned long ifa, struct pt_regs *regs, PSCB(current, iim) = iim; vector = IA64_SPECULATION_VECTOR; break; + case 29: + vector = IA64_DEBUG_VECTOR; + if (debugger_trap_entry(vector,regs)) + return; + break; case 30: // FIXME: Should we handle unaligned refs in Xen?? vector = IA64_UNALIGNED_REF_VECTOR; @@ -681,19 +686,19 @@ ia64_handle_reflection(unsigned long ifa, struct pt_regs *regs, vector = IA64_LOWERPRIV_TRANSFER_TRAP_VECTOR; break; case 35: - printk("ia64_handle_reflection: handling taken branch trap\n"); vector = IA64_TAKEN_BRANCH_TRAP_VECTOR; + if (debugger_trap_entry(vector,regs)) + return; break; case 36: - printk("ia64_handle_reflection: handling single step trap\n"); vector = IA64_SINGLE_STEP_TRAP_VECTOR; + if (debugger_trap_entry(vector,regs)) + return; break; default: - printk("ia64_handle_reflection: unhandled vector=0x%lx\n", - vector); - while (vector) - /* spin */; + panic_domain(regs, "ia64_handle_reflection: " + "unhandled vector=0x%lx\n", vector); return; } if (check_lazy_cover && (isr & IA64_ISR_IR) && diff --git a/xen/include/asm-ia64/debugger.h b/xen/include/asm-ia64/debugger.h index 3e6a51d2e4..747e5a79cf 100644 --- a/xen/include/asm-ia64/debugger.h +++ b/xen/include/asm-ia64/debugger.h @@ -56,13 +56,6 @@ show_execution_state(struct cpu_user_regs *regs) #ifdef CRASH_DEBUG // crash_debug=y -/* The main trap handlers use these helper macros which include early bail. */ -static inline int debugger_trap_entry( - unsigned int vector, struct cpu_user_regs *regs) -{ - return 0; -} - extern int __trap_to_cdb(struct cpu_user_regs *r); static inline int debugger_trap_fatal( unsigned int vector, struct cpu_user_regs *regs) @@ -80,16 +73,7 @@ static inline int debugger_trap_fatal( #define smp_send_stop() /* nothing */ #endif -#elif defined DOMU_DEBUG -// domu_debug=y -#warning "domu_debug is not implemented yet." -/* The main trap handlers use these helper macros which include early bail. */ -static inline int debugger_trap_entry( - unsigned int vector, struct cpu_user_regs *regs) -{ - return 0; -} - +#else static inline int debugger_trap_fatal( unsigned int vector, struct cpu_user_regs *regs) { @@ -97,22 +81,21 @@ static inline int debugger_trap_fatal( } #define debugger_trap_immediate() ((void)0) -#else -/* The main trap handlers use these helper macros which include early bail. */ +#endif + static inline int debugger_trap_entry( unsigned int vector, struct cpu_user_regs *regs) { - return 0; -} + struct vcpu *v = current; + + if (guest_kernel_mode(regs) && v->domain->debugger_attached) { + domain_pause_for_debugger(); + return 1; + } -static inline int debugger_trap_fatal( - unsigned int vector, struct cpu_user_regs *regs) -{ return 0; } -#define debugger_trap_immediate() ((void)0) -#endif #endif // __ASSEMBLLY__ #endif /* __ASM_DEBUGGER_H__ */ diff --git a/xen/include/asm-ia64/linux-xen/asm/ptrace.h b/xen/include/asm-ia64/linux-xen/asm/ptrace.h index c63da0a5f9..d38f4e9390 100644 --- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h +++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h @@ -267,6 +267,7 @@ struct switch_stack { # define ia64_psr(regs) ((struct ia64_psr *) &(regs)->cr_ipsr) #ifdef XEN # define guest_mode(regs) (ia64_psr(regs)->cpl != 0) +# define guest_kernel_mode(regs) (ia64_psr(regs)->cpl == 2) #else # define user_mode(regs) (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0) #endif -- 2.30.2